using System; using System.Collections.Generic; namespace UnityEngine.EventSystems { /// <summary> /// Base class for any RayCaster. /// </summary> /// <remarks> /// A Raycaster is responsible for raycasting against scene elements to determine if the cursor is over them. Default Raycasters include PhysicsRaycaster, Physics2DRaycaster, GraphicRaycaster. /// Custom raycasters can be added by extending this class. /// </remarks> public abstract class BaseRaycaster : UIBehaviour { private BaseRaycaster m_RootRaycaster; /// <summary> /// Raycast against the scene. /// </summary> /// <param name="eventData">Current event data.</param> /// <param name="resultAppendList">List of hit Objects.</param> public abstract void Raycast(PointerEventData eventData, List<RaycastResult> resultAppendList); /// <summary> /// The camera that will generate rays for this raycaster. /// </summary> public abstract Camera eventCamera { get; } [Obsolete("Please use sortOrderPriority and renderOrderPriority", false)] public virtual int priority { get { return 0; } } /// <summary> /// Priority of the raycaster based upon sort order. /// </summary> public virtual int sortOrderPriority { get { return int.MinValue; } } /// <summary> /// Priority of the raycaster based upon render order. /// </summary> public virtual int renderOrderPriority { get { return int.MinValue; } } /// <summary> /// Raycaster on root canvas /// </summary> public BaseRaycaster rootRaycaster { get { if (m_RootRaycaster == null) { var baseRaycasters = GetComponentsInParent<BaseRaycaster>(); if (baseRaycasters.Length != 0) m_RootRaycaster = baseRaycasters[baseRaycasters.Length - 1]; } return m_RootRaycaster; } } public override string ToString() { return "Name: " + gameObject + "\n" + "eventCamera: " + eventCamera + "\n" + "sortOrderPriority: " + sortOrderPriority + "\n" + "renderOrderPriority: " + renderOrderPriority; } protected override void OnEnable() { base.OnEnable(); RaycasterManager.AddRaycaster(this); } protected override void OnDisable() { RaycasterManager.RemoveRaycasters(this); base.OnDisable(); } protected override void OnCanvasHierarchyChanged() { base.OnCanvasHierarchyChanged(); m_RootRaycaster = null; } protected override void OnTransformParentChanged() { base.OnTransformParentChanged(); m_RootRaycaster = null; } } }